﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

using FarseerPhysics;
using FarseerPhysics.Dynamics;
using FarseerPhysics.Collision;
using FarseerPhysics.Factories;
using FarseerPhysics.Controllers;

namespace GameDev_Story.Objetos
{
    class Cleber:Objetos.Sprite
    {
        /// <summary>
        /// Animação do personagem se movimentando para a direita.
        /// </summary>
        animacao direita;
        /// <summary>
        /// Animação do personagem se movimentando para a esquerda.
        /// </summary>
        animacao esquerda;
        /// <summary>
        /// Animação do personagem se movimentando para cima.
        /// </summary>
        animacao subindo;
        /// <summary>
        /// Animação do personagem se movimentando para baixo.
        /// </summary>
        animacao descendo;
        /// <summary>
        /// Animação do personagem parado.
        /// </summary>
        animacao parado;
        /// <summary>
        /// Animação do personagem pulando.
        /// </summary>
        animacao pulando;
        /// <summary>
        /// Animação do personagem abrindo portas.
        /// </summary>
        animacao abrindoportas;
        /// <summary>
        /// Animação do personagem pegando itens.
        /// </summary>
        animacao pegandoitens;
        /// <summary>
        /// Animação do personagem soltando itens.
        /// </summary>
        animacao soltandoitens;
        /// <summary>
        /// Animação do personagem atacando.
        /// </summary>
        animacao atacando;
        /// <summary>
        /// Animação do personagem soltando um ataque especial.
        /// </summary>
        animacao especial;

        GamePadState joystick_atual, joystick_anterior;

        public animacao animacao_atual;

        Body characterBody;

        Body bodyChao;


    
       
      
        public Cleber(Texture2D textura, GameWindow Window):base(textura)
        {
            this.velocidade = new Vector2(5,5);
                        
            this.window = Window;
            parado = new animacao();
            parado.qtd_quadros = 2;
            parado.quadros_seg = 2;
            parado.Y = 256;
            parado.quadro_X = 64;
            parado.quadro_Y = 64;

            characterBody = BodyFactory.CreateRectangle(Game1.simulator, textura.Width/2, textura.Height/11, 1);
           //characterBody.Restitution = 1f;
            characterBody.BodyType = BodyType.Dynamic;


            //bodyChao = BodyFactory.CreateRectangle(Game1.simulator, 1, 1,1, new Vector2(window.ClientBounds.Width, window.ClientBounds.Height));
            //bodyChao.BodyType = BodyType.Static;
            
            animacao_atual = parado;
        }
        public override void Update(GameTime gameTime){}
        public void Update(GameTime gameTime, KeyboardState teclado, KeyboardState teclado_anterior, GamePadState joystick, GamePadState joystick_anterior)
        {
            this.posicao= characterBody.Position;

            //Funções de movimento do personagem.
            if (teclado.IsKeyDown(Keys.Right) && topulando == false)
            {
                //testeoff = false;
                posicao.X += velocidade.X;
                direita = new animacao();
                direita.qtd_quadros = 2;
                direita.quadros_seg = 2;
                direita.Y = 0;
                direita.quadro_X = 64;
                direita.quadro_Y = 64;
                animacao_atual = direita;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.Left) && topulando == false)
            {
                posicao.X -= velocidade.X;
                esquerda = new animacao();
                esquerda.qtd_quadros = 2;
                esquerda.quadros_seg = 2;
                esquerda.Y = 64;
                esquerda.quadro_X = 64;
                esquerda.quadro_Y = 64;
                animacao_atual = esquerda;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.Up) && topulando == false)
            {
                posicao.Y -= velocidade.Y;
                subindo = new animacao();
                subindo.qtd_quadros = 2;
                subindo.quadros_seg = 2;
                subindo.Y = 128;
                subindo.quadro_X = 64;
                subindo.quadro_Y = 64;
                animacao_atual = subindo;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.Down) && topulando == false)
            {
                posicao.Y += velocidade.Y;
                descendo = new animacao();
                descendo.qtd_quadros = 2;
                descendo.quadros_seg = 2;
                descendo.Y = 192;
                descendo.quadro_X = 64;
                descendo.quadro_Y = 64;
                animacao_atual = descendo;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyUp(Keys.Right) && teclado.IsKeyUp(Keys.Left) && teclado.IsKeyUp(Keys.Up) && teclado.IsKeyUp(Keys.Down) && topulando == false)
            {
                parado = new animacao();
                parado.qtd_quadros = 2;
                parado.quadros_seg = 2;
                parado.Y = 256;
                parado.quadro_X = 64;
                parado.quadro_Y = 64;
                animacao_atual = parado;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.Space) && topulando == false)
            {
                characterBody.ApplyLinearImpulse(new Vector2(0, -20f));
                topulando = true;
                pulando = new animacao();
                pulando.qtd_quadros = 2;
                pulando.quadros_seg = 2;
                pulando.Y = 320;
                pulando.quadro_X = 64;
                pulando.quadro_Y = 64;
                animacao_atual = pulando;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.X) && topulando == false)
            {
                abrindoportas = new animacao();
                abrindoportas.qtd_quadros = 2;
                abrindoportas.quadros_seg = 2;
                abrindoportas.Y = 384;
                abrindoportas.quadro_X = 64;
                abrindoportas.quadro_Y = 64;
                animacao_atual = abrindoportas;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.S) && topulando == false)
            {
                pegandoitens = new animacao();
                pegandoitens.qtd_quadros = 2;
                pegandoitens.quadros_seg = 2;
                pegandoitens.Y = 448;
                pegandoitens.quadro_X = 64;
                pegandoitens.quadro_Y = 64;
                animacao_atual = pegandoitens;
                characterBody.Position = posicao;
            } 
            //Probleminha AQUI, na Função de soltar, mesmo botão, ou solta ou cata @_@
            //if (teclado.IsKeyDown(Keys.S))
            //{
            //    soltandoitens = new animacao();
            //    soltandoitens.qtd_quadros = 2;
            //    soltandoitens.quadros_seg = 2;
            //    soltandoitens.Y = 512;
            //    soltandoitens.quadro_X = 64;
            //    soltandoitens.quadro_Y = 64;
            //    animacao_atual = soltandoitens;

            if (teclado.IsKeyDown(Keys.Z) && topulando == false)
            {
                atacando = new animacao();
                atacando.qtd_quadros = 2;
                atacando.quadros_seg = 2;
                atacando.Y = 576;
                atacando.quadro_X = 64;
                atacando.quadro_Y = 64;
                animacao_atual = atacando;
                characterBody.Position = posicao;
            }
            if (teclado.IsKeyDown(Keys.B) && topulando == false)
            {
                especial = new animacao();
                especial.qtd_quadros = 2;
                especial.quadros_seg = 2;
                especial.Y = 640;
                especial.quadro_X = 64;
                especial.quadro_Y = 64;
                animacao_atual = especial;
                characterBody.Position = posicao;
            }
   
            if(joystick.ThumbSticks.Left.X == -1)
            {
                this.posicao.X -=10;
               
            }
                /*
            else if (joystick.ThumbSticks.Left.X >= 1 / 2)
            {
                this.posicao.X += 5;
                Console.WriteLine("asd");

            }

            else if (joystick.ThumbSticks.Left.X <= -1/2)
            {
                this.posicao.X -= 5;
            }
            */
            else if (joystick.ThumbSticks.Left.X == 1)
            {
                this.posicao.X += 10;
                
            }

            else if (joystick.ThumbSticks.Left.Y == -1)
            {
                this.posicao.Y += 10;
            }

                /*
            else if (joystick.ThumbSticks.Left.Y >= 1/2)
            {
                this.posicao.Y += 10;
            }

            else if (joystick.ThumbSticks.Left.Y <= -1/2)
            {
                this.posicao.Y -= 10;
            }
            */
            else if (joystick.ThumbSticks.Left.Y == 1)
            {
                this.posicao.Y -= 10;
            }

            

            if (posicao.Y <= 0)
            {
                posicao.Y = 0;
                characterBody.Position = this.posicao;
            }
            if (posicao.X <= 0)
            {
                posicao.X = 0;
                characterBody.Position = this.posicao;
            }
            if (posicao.Y >= window.ClientBounds.Height - textura.Height/11)
            {
                
                posicao.Y = window.ClientBounds.Height - textura.Height/11;
                characterBody.Position = this.posicao;
                
            }
            if (posicao.X >= window.ClientBounds.Width - textura.Width/2)
            {
                posicao.X = window.ClientBounds.Width - textura.Width/2;
                characterBody.Position = this.posicao;
            }
           
     

            Console.WriteLine(characterBody.Position);
        }
        public bool Bateu(Sprite sprite)
        {
            if (this.colisao.Intersects(sprite.Colisao))
            {
                return true;
            }
            else return false;
        }
        
        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            base.Draw(gameTime, spriteBatch, animacao_atual,posicao);
        }
    }
}
